package com.example.demo16_custom_detailssource.config;

import org.springframework.security.authentication.AuthenticationServiceException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;

public class MyAuthenticationProvider extends DaoAuthenticationProvider {


    /**
     * 自定义 AuthenticationProvider 继承自 DaoAuthenticationProvider 重写 additionalAuthenticationChecks 方法，
     * additionalAuthenticationChecks 默认是在检查 登录的密码是否匹配，我们可以在这里额为加入验证码验证的功能，就不专门添加过滤器破坏原有过滤器链。
     *
     * 我们已经在 setDetails 中给 Authentication 设置了自定义的 MyWebAuthenticationDetails,
     * 而在创建 MyWebAuthenticationDetails 时将会校验验证码，当校验成功时就将其属性 isPassed 设置为 true。
     *
     * 所以此时我们可以直接取出 Authentication 的 Details 中的 isPassed 来判断验证码是否校验通过。
     */
    @Override
    protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
        boolean isPassed = ((MyWebAuthenticationDetails) authentication.getDetails()).isPassed();
        if (!isPassed){
            throw new AuthenticationServiceException("验证码错误");
        }
        super.additionalAuthenticationChecks(userDetails, authentication);
    }
}
